Карта сохраняется в папке _build с именем WurstRunMap если запущено с командой Run Map, либо именем, указанным в файле wurst.build, если производилась сборка командой Build.
Так же можно заглянуть в папку самого компилятора за логами компиляции (Мой Компуктер/Users/ИмяПользователя/.Wurst/Logs/compiler.log).
Я уже понял в чём проблема. Я опять забыл пропустить карту через ран, перед билдом и сидел тупо несколько часов))))
Стас Орлов, отражать суть и относиться - это разные вещи, заголовки находятся в гугле, если новичок столкнется с такой же проблемой, он наткнется на твой вопрос, где будет решение его проблемы.
Также обрати внимание на бота, он выдает результаты по совпадению заголовков, очень важно, чтобы заголовки были как можно точнее
Такое происходит. когда сохранение карты было прервано. Например кликнул сохранить и выключил комп или редактор недождавшись, пока оно сохранит.
Да, работа коту под хвост, делай бекапы чаще(
И еще 1 момент, на какой версии варика ты разрабатывал и на какой версии решил открыть?
Если разрабатывал в рефордже а потом решил открыть в стандартном варике - то тоже будет выдавать подобную ошибку.
Делаю на 1.26. Теперь понятно в чём проблемма. Комп отрубился, и видимо карта не успела сохраниться. Ну что же, сегодня явно не мой день
Camera Bounds не локальные, это границы обзора, их юзают 100500 бж констант, по ним определяется границы в пределах которых ты можешь двигать игровую камеру. Что ты собрался спрятать на миникарте? Есть способ менять иконки юнитам на пустые, есть соответствующая нативка.
Ну и самый радикальный метод - режим киниматика, там пропадает интерфейс целиком, но вроде можно было сделать чтобы курсор остался и возможность контроля.
Предположим, что это лабиринт. И как написал человек сверху размер отображения миникарты поставить на размер того, что попадает в один экран. Такое сделать возможно?
Ага, только ты сделал бездумно. Таймер то и течёт, а откуда тебя будет браться GetTriggerUnit?потом ты откуда то копировал этот код, но не разобрался как он работает.
Я копировал из своей карты. Я кинул не весь код триггера, а только кусок с тайиером. До этого там был использован вейтЮ я решил заменить на таймер и запутался.
Ну смотри есть несколько вариантов.
Первый самый очевидный: ты делаешь эту способность на гуи без использования локальных переменных, что может привести к конфликту. Т.к. последний созданный юнит(и прочее со словом последний или в других его интерпритациях) на гуи - проверяет по всей карте, банально может совпасть и где-то создаётся другой юнит в тот момент, когда появляется твой и триггер багает.
Второй вариант: советую попробовать поставить задержку в цикле на секунду или даже меньше. Возможно проблема в том, что происходит слишком много действий за короткий промежуток времени.
Это самые очевидные варианты, попробуй их.
Смотри, тут всё просто. Ошибка в том, что сам приказ вейт плохо работает(сам на нём много раз попадался. Всё что тебе нужно это хеш таблица в карте.
function Timer takes takes nothing returns nothing
local timer t = GetExpiredTimer() создаём локальную переменную таймера и присваеваем ей истёкший таймер
local integer id = GetHandleId(t) узнаём id этого таймера
local unit test = LoadUnitHandle(udg_hash, id, 1) загружаем юнита-цель, если это нужный таймер(id васё определит)
call UnitAddSleepPerm( test, false ) будим нужного юнита
endfunction
function Trig_Test_Actions takes nothing returns nothing
local timer t = CreateTimer() создаём локальный таймер
local integer id = GetHandleId(t) находим id таймера
local unit test = GetSpellTargetUnit() берём юнита-цель способности
TimerStart(t, 10, false, Timer) создаём таймер на 10 сек и активируем функцию по истечению тайсера
call UnitAddSleepPerm( test, true ) приказваем юнита-цель уснуть
SaveUnitHandle(udg_hash, id, 1, test) сохраняем юнита-цель в таблице по id таймера
endfunction
Примерно так, тебе нужно только поменять приказы и всё. И добавить хеш таблицу, если её нет.
Ну чтобы идти куда-то надо использовать IssuePointOrder(unit,x,y,"move") и вызывать эту функцию по таймеру каждые n секунд, если текущий приказ отличается от "move", то снова вызывать, и ждать через IsUnitInRangeXY когда юнит дойдёт до цели, полезная штука чтобы юнит дошёл куда либо если его например оглушили или сдвинули или воскресили после смерти.
Могу показать только на луа, там без хештаблиц и пару строк кода всего
Я делаю на джасс. У меня ТД и юнит сперва движеться, потом может остановиться и применить способность или сражаться с кем-то. И мне нужно сохранить отданный приказ, что бы он пошёл снова, даже при у чёте, что его например телепортируют. А двигаются юниты через области. Так что движение через точку на карти не канает.
А как это сделать? Можно пример кода? Допустим есть действе идти туда-то. Спустя 2 секунды повторить этот приказ. В какую переменную сохранять этот приказ и как потом заставить его выполнить потом?
У твоего триггера события нету, у тебя же нет отдельной ситсмы как у меня в карте которая следит за всеми юнитами на карте и когда они кастуют спеллы ищет в бд фунцию спелла и вызвает её. Так что все ручками, дебаг сообщения так же не мешает сделать.
У твоего триггера события нету, у тебя же нет отдельной ситсмы как у меня в карте которая следит за всеми юнитами на карте и когда они кастуют спеллы ищет в бд фунцию спелла и вызвает её. Так что все ручками, дебаг сообщения так же не мешает сделать.
Я правильно понимаю, что это работать будет примерно так: юнит применяет способность и активирует триггер, если это нужная сопосбности то идёт работа. На юнита навешивается щит и записывается его показатель как реальная, потом (я до конца не понял как) высчитывается урон, который проходит в момент нанесения, а не в момент "юнит атакова" после чего даются бонусные за, а потом восстанавливаются до нужного размера.поэтому осталось всего пара вопросов. Первый, я так и не понял, как высчитать урон в момент атаки. Второй хватит ли одного события, что бы заработали все триггеры, или же нужно несколько событий, но как указать, что бы выполнялись конкретные действия?
У тебя ошибка, фукнкцию которую ты хочешь вызвать должна находится выше места вызова.
Unholy_Shield_End должна быть описана выше чем Sosdanie_Shita_Act1
Ну и вовсе, тебе нужен не хендл ид юнита а таймера,ибо сохранять ты данные должен на таймер а не на юнита, когда таймер истечет и вызовет функцию, внутри этой функции у тебя будет работать функция GetExpiredTimer() - которая вернет тот таймер, который запустил эту функцию, это единственный обьект связывающий твой триггер и функцию Unholy_Shield_End, и разумеется GetTriggerUnit() - не будет работать в потоке таймера, т.к это функция реакция на событие триггера. Ты походу копипастишь код совершенно не вникая в принципы его работы.
Я это уже после того, как спросил понял и поменял код, однако он всё равно не хочет работать.
function Unholy_Shield_Cast_Cond1 takes nothing returns boolean условие первое для проверки способности
return GetSpellAbilityId() == 'A00V'
endfunction
function Unholy_Shield_End takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit attacked = LoadUnitHandle(udg_hash,h,1)
call UnitRemoveBuffBJ( 'B009', attacked )
endfunction
function Sosdanie_Shita_Act1 takes nothing returns nothing
local real shieldBlock = 150.00 Число, которое показывает колличество блокируемого урона
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local timer t = CreateTimer ()
local integer h = GetHandleId(w) узнаём ID юнита на которого повесили щит
local integer j = GetHandleId(t) Узнаём ID таймера конца
local real time = 3.00
call TimerStart (t, time, false, function Unholy_Shield_End)
call SaveUnitHandle(udg_hash,j,1,w) Записываем юнита для таймера
call SaveReal(udg_hash,h,2, shieldBlock)
call SaveUnitHandle(udg_hash,h,1,w) Записываем юнита, на которого повеслили щит
set t = null
set w = null
endfunction
===========================================================================
function InitTrig_Unholy_shield_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_Jass = CreateTrigger( )
call TriggerAddAction (gg_trg_Unholy_shield_Jass, function Sosdanie_Shita_Act1)
call TriggerAddCondition( gg_trg_Unholy_shield_Jass, Condition( function Unholy_Shield_Cast_Cond1 ) )
endfunction
Заклинание с юнита не убирается, почему? Вроде бы всё написал...
» WarCraft 3 / Warcraft 3 Reforged: Как в триггерах отобразить враждеюных нейтр
» WarCraft 3 / Конвертировать ID юнита в саммого юнита (wurst)
» WarCraft 3 / Убрать эффект телепортации
» WarCraft 3 / Конвертировать ID юнита в саммого юнита (wurst)
» WarCraft 3 / Убрать эффект телепортации
» WarCraft 3 / wurst билд карты
» WarCraft 3 / wurst.startmap' not found как исправить?
» WarCraft 3 / wurst.startmap' not found как исправить?
» WarCraft 3 / Изменение данных через WPQ editor
» WarCraft 3 / Изменение данных через WPQ editor
» WarCraft 3 / Открыть карту
» WarCraft 3 / Открыть карту
» WarCraft 3 / Карта не открывается
» WarCraft 3 / Миникарта
» WarCraft 3 / Таймер
Ред. Стас Орлов
» WarCraft 3 / Таймер
» WarCraft 3 / Помогите с созданием ловушки
» WarCraft 3 / Нужна помощь с триггером
Первый самый очевидный: ты делаешь эту способность на гуи без использования локальных переменных, что может привести к конфликту. Т.к. последний созданный юнит(и прочее со словом последний или в других его интерпритациях) на гуи - проверяет по всей карте, банально может совпасть и где-то создаётся другой юнит в тот момент, когда появляется твой и триггер багает.
Второй вариант: советую попробовать поставить задержку в цикле на секунду или даже меньше. Возможно проблема в том, что происходит слишком много действий за короткий промежуток времени.
Это самые очевидные варианты, попробуй их.
» WarCraft 3 / Таймер вместо вейта
function Timer takes takes nothing returns nothing
local timer t = GetExpiredTimer() создаём локальную переменную таймера и присваеваем ей истёкший таймер
local integer id = GetHandleId(t) узнаём id этого таймера
local unit test = LoadUnitHandle(udg_hash, id, 1) загружаем юнита-цель, если это нужный таймер(id васё определит)
call UnitAddSleepPerm( test, false ) будим нужного юнита
endfunction
local timer t = CreateTimer() создаём локальный таймер
local integer id = GetHandleId(t) находим id таймера
local unit test = GetSpellTargetUnit() берём юнита-цель способности
TimerStart(t, 10, false, Timer) создаём таймер на 10 сек и активируем функцию по истечению тайсера
call UnitAddSleepPerm( test, true ) приказваем юнита-цель уснуть
SaveUnitHandle(udg_hash, id, 1, test) сохраняем юнита-цель в таблице по id таймера
endfunction
» WarCraft 3 / Иконки из HOTS
» WarCraft 3 / Магическая атака
» WarCraft 3 / Сохранение приказа
» WarCraft 3 / Сохранение приказа
» WarCraft 3 / таймер
Ред. Стас Орлов
» WarCraft 3 / таймер
return GetSpellAbilityId() == 'A00V'
endfunction
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
local unit attacked = LoadUnitHandle(udg_hash,h,1)
call UnitRemoveBuffBJ( 'B009', attacked )
endfunction
local real shieldBlock = 150.00 Число, которое показывает колличество блокируемого урона
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local timer t = CreateTimer ()
local integer h = GetHandleId(w) узнаём ID юнита на которого повесили щит
local integer j = GetHandleId(t) Узнаём ID таймера конца
local real time = 3.00
call TimerStart (t, time, false, function Unholy_Shield_End)
call SaveUnitHandle(udg_hash,j,1,w) Записываем юнита для таймера
call SaveReal(udg_hash,h,2, shieldBlock)
call SaveUnitHandle(udg_hash,h,1,w) Записываем юнита, на которого повеслили щит
set t = null
set w = null
endfunction
function InitTrig_Unholy_shield_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_Jass = CreateTrigger( )
call TriggerAddAction (gg_trg_Unholy_shield_Jass, function Sosdanie_Shita_Act1)
call TriggerAddCondition( gg_trg_Unholy_shield_Jass, Condition( function Unholy_Shield_Cast_Cond1 ) )
endfunction